package com.agg.persist.provider;

import com.agg.core.base.dto.ExtDTO;
import com.agg.core.utils.Asserts;
import com.agg.persist.xml.EntityMapperRegistry;
import com.agg.persist.xml.mapping.EntityMapper;
import com.agg.persist.xml.util.DruidSQLBuilder;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.builder.annotation.ProviderContext;

import java.io.Serializable;
import java.util.Map;

public class SelectTemplateProvider extends AbstractSelectTemplateProvider{

    /**
     *
     * @param t
     * @param context
     * @param <T>
     * @return
     */
    public <T> String getByPageTemplate(Page<T> page,
                                        @Param("cm") T t,
                                        @Param("ex")ExtDTO extDTO,
                                        String entityMapperId,
                                        ProviderContext context) {

        //映射配置
       // String sqlTpl=EntityMapperRegistry.sqlTpl(entityMapperId);
        EntityMapper em= EntityMapperRegistry.getEntityMapper(entityMapperId);

        DruidSQLBuilder sqlBuilder=new DruidSQLBuilder();
        String sql=sqlBuilder.sql(em,t,extDTO,null);
        //用户实体映射id 有效，则按映射关系拼接sql
        if(Asserts.isNullOrEmpty(sql) ){
            return defaultSql(context);
        }else{
            return sql;
        }
    }


    /**
     *
     * @param t
     * @param context
     * @param <T>
     * @return
     */
    public <T> String getListByTemplate( @Param("cm") T t,
                                        @Param("ex")ExtDTO extDTO,
                                        String entityMapperId,
                                        ProviderContext context) {

        //映射配置
        // String sqlTpl=EntityMapperRegistry.sqlTpl(entityMapperId);
        EntityMapper em= EntityMapperRegistry.getEntityMapper(entityMapperId);

        DruidSQLBuilder sqlBuilder=new DruidSQLBuilder();
        String sql=sqlBuilder.sql(em,t,extDTO,null);
        //用户实体映射id 有效，则按映射关系拼接sql
        if(Asserts.isNullOrEmpty(sql) ){
            return defaultSql(context);
        }else{
            return sql;
        }
    }

    /**
     *
     * @param id
     * @param context
     * @param <T>
     * @return
     */
    public <T> String getByIdTemplate(Serializable id,
                                         String entityMapperId,
                                         ProviderContext context) {
        EntityMapper em= EntityMapperRegistry.getEntityMapper(entityMapperId);
        DruidSQLBuilder sqlBuilder=new DruidSQLBuilder();
        String sql=sqlBuilder.sql(em,null);
        //用户实体映射id 有效，则按映射关系拼接sql
        if(Asserts.isNullOrEmpty(sql) ){
            sql=defaultSql(context);
        }
        SQLUtils.addCondition(sql,em.getAlias()+".id="+"#{id}", JdbcConstants.MYSQL);
        return sql;
    }



    /**
     *
     * @param t
     * @param context
     * @param <T>
     * @return
     */
    public <T> String getByEntity(@Param("cm") T t,
                            String entityMapperId,
                            ProviderContext context) {
        //映射配置
        String sqlTpl=EntityMapperRegistry.sqlTpl(entityMapperId);
        EntityMapper em= EntityMapperRegistry.getEntityMapper(entityMapperId);
        //用户实体映射id 有效，则按映射关系拼接sql
        if(Asserts.isNullOrEmpty(sqlTpl) ){
            return defaultSql(context);
        }else{
            return getSqlWithCondition(sqlTpl,em,t);
        }
    }

    /**
     *
     * @param t
     * @param context
     * @param <T>
     * @return
     */
    public  String getMapByPageTemplate(Page<Map<String,Object>> page,
                                        @Param("cm") Map<String,Object> t,
                                        @Param("ex")ExtDTO extDTO,
                                        String entityMapperId,
                                        ProviderContext context) {
        //映射配置
        // String sqlTpl=EntityMapperRegistry.sqlTpl(entityMapperId);
        EntityMapper em= EntityMapperRegistry.getEntityMapper(entityMapperId);
        DruidSQLBuilder sqlBuilder=new DruidSQLBuilder();
        if(em==null){
            System.out.println("entity mapper is null");
            throw new RuntimeException("系统错误");
        }
        String sql=sqlBuilder.sql(em,t,extDTO,extDTO.getColumns());
        //用户实体映射id 有效，则按映射关系拼接sql
        if(Asserts.isNullOrEmpty(sql) ){
            return defaultSql(context);
        }else{
            return sql;
        }
    }



    /**
     *
     * @param t
     * @param context
     * @param <T>
     * @return
     */
    public  String getMapBySqlPageTemplate(Page<Map<String,Object>> page,
                                        @Param("cm") Map<String,Object> t,
                                        @Param("ex") ExtDTO extDTO,
                                        String sqlTemplate,
                                        ProviderContext context) {

        return sqlTemplate;
    }
}
